// extends 
// interface
// enum
// ?
// readonly
// implements
// keyof : 遍历某种类型的属性 用keyof就可以提取属性的名称 

interface Person{
  name:string;
  age:number;
  location:string;
}

type K1 = keyof Person //? name | age | location //?
type K2 = keyof Person[] // 提取的是数组的属性 数组的操作方法或者属性
type K3 = keyof {[x:string]:Person} // string| number
type K4 = keyof number; // number的所有属性和方法
// let k :K4 = 'toLocaleString'

// keyof的作用
// function prop(obj,key){
//   return obj[key]
// }

// string / number 
// function prop(obj:object,key:string){
//   return obj[key] //?
// }
// prop({a:10},'a')//?

function prop<T extends object,K extends keyof T>(obj:T,key:K){
  return obj[key]
}

//T extends object T是对object的一个扩展
// K extends keyof T  K extends T所有的键
type Todo = {
  id:number;
  text:string;
  done : boolean
}

const todo : Todo ={
  id:1,
  text:'learn Typescript Am Happy',
  done : false
}

const id = prop(todo,'id') //?
const text = prop(todo ,'text') //?
